Temporary Adapter

단순히 선분에 대해 여러개의 점으로 변환하는 어댑터는 비효율적인 중복 작업이다.
캐싱을 이용해서 이와 같은 작업을 단순화할 수 있다.
(모든 Point를 애플리케이션이 기동할 때 미리 어댑터를 이용해 정의해 두고 재활용)

DrawPoints()를 수행할 때 마다 루프를 수행(LineToPointAdapter)를 수행하는 것이 아닌,
별도의 캐시(Point vector)를 정의해 두고 여기에 저장한다.
vector<Point> points;
for(auto& o: vectorObjects){
for(auto& l: *o){
LineToPointAdapter lpo{l};
for(auto& p: lpo) points.push_back(p);
}
}
DrawPoints(dc, points.begin(), points.end());
하지만, 위의 코드에서 원본 vectorObject가 변환된 경우에는 선분을 다시 점으로 변환하는 과정이 필요하다.
반복 변환을 피하기 위해(원본이 바뀌었을 때 포함)서는 각각의 선분을 유일하게 식별할 방법이 필요하다.
struct Point{
int x, y;
friend std::size_t hash_value(const Point& obj){
std::size_t seed=0x725C686F;
boost::hash_combine(seed, obj.x);
boost::hash_combine(seed, obj.y);
return seed;
}
};
struct Line{
Point start, end;
friend std::size_t hash_value(const Line& obj){
std::size_t seed=0x719E6B16;
boost::hash_combine(seed, obj.start);
boost::hash_combine(seed, obj.end);
return seed;
}
};
static map<size_t, Points> cache;
virtual Points::iterator begin(){return cache[line_hash].begin();}
virtual Points::iterator end(){return cache[line_hash].end();}
LineToPointCachingAdapter(Line& line){ //
static boost::hash<Line> hash;
line_hash=hash(line);
if(cache.find(line_hash)!=cache.end()) return; //
Points points;
// same as LineToPointAdapter
cache[line_hash]=points;
}
해시 함수를 이용한 캐시를 통해 꼭 필요한 경우에만 변환 생성 작업을 수행한다.